/********************
*                   *
*   NeHeGL Header   *
*                   *
**********************************************************************************
*                                                                                *
*	You Need To Provide The Following Functions:                             *
*                                                                                *
*	BOOL Initialize (GL_Window* window, Keys* keys);                         *
*		Performs All Your Initialization                                 *
*		Returns TRUE If Initialization Was Successful, FALSE If Not      *
*		'window' Is A Parameter Used In Calls To NeHeGL                  *
*		'keys' Is A Structure Containing The Up/Down Status Of keys      *
*                                                                                *
*	void Deinitialize (void);                                                *
*		Performs All Your DeInitialization                               *
*                                                                                *
*	void Update (DWORD milliseconds);                                        *
*		Perform Motion Updates                                           *
*		'milliseconds' Is The Number Of Milliseconds Passed Since        *
*               The Last Call With Whatever Accuracy GetTickCount() Provides     *
*                                                                                *
*	void Draw (void);                                                        *
*		Perform All Your Scene Drawing                                   *
*                                                                                *
*********************************************************************************/

#ifndef GL_FRAMEWORK__INCLUDED
#define GL_FRAMEWORK__INCLUDED

#include <windows.h>		       		// Header File For Windows

#define WM_TOGGLEFULLSCREEN (WM_USER+1)	 	// Application Define Message For Toggling


static BOOL g_createFullScreen;			// If TRUE, Then Create Fullscreen

typedef struct {		   		// Structure For Keyboard Stuff
	BOOL keyDown [256];	   		// Holds TRUE / FALSE For Each Key
	BOOL keyUp   [256];	   		// Holds TRUE / FALSE For Each Key
} Keys;												// Keys

typedef struct {		   		// Contains Information Vital To Applications
	HINSTANCE		hInstance;      // Application Instance
	const char*		className;     	// Application ClassName
} Application;				       	// Application

typedef struct {		    		// Window Creation Info
	Application*		application;	// Application Structure
	char*	  		title;	        // Window Title
	int	  		width;		// Width
	int	  		height;		// Height
	int	  		bitsPerPixel;	// Bits Per Pixel
	BOOL	  		isFullScreen;	// FullScreen?
} GL_WindowInit;			 	// GL_WindowInit

typedef struct {			 	// Contains Information Vital To A Window
	Keys*		       	keys;	        // Key Structure
	HWND		       	hWnd;	        // Window Handle
	HDC		       	hDC; 	        // Device Context
	HGLRC		       	hRC; 	        // Rendering Context
	GL_WindowInit		init;	  	// Window Init
	BOOL			isVisible;   	// Window Visible?
	DWORD			lastTickCount;	// Tick Counter
} GL_Window;				      	// GL_Window

void TerminateApplication (GL_Window* window);	// Terminate The Application

void ToggleFullscreen (GL_Window* window);    	// Toggle Fullscreen / Windowed Mode

// These Are The Function You Must Provide
BOOL Initialize (GL_Window* window, Keys* keys);// Performs All Your Initialization

void Deinitialize (void);		 	// Performs All Your DeInitialization

void Update (DWORD milliseconds);	 	// Perform Motion Updates

void Draw (void);			 	// Perform All Your Scene Drawing

void ReshapeGL (int width, int height);	 	// Reshape The Window When It's Moved Or Resized

BOOL CreateWindowGL (GL_Window* window); 	// This Code Creates Our OpenGL Window

BOOL DestroyWindowGL (GL_Window* window);	// Destroy The OpenGL Window & Release Resources

#endif												// GL_FRAMEWORK__INCLUDED
